/**
* @brief    CRC校验
* @file     CRC.h
* @author   何锡斌
* @email    2537274979@qq.com
* @date     2024/02/18
* @version  V1_0_0
* @par      实现功能：
* - CRC校验(查表法)/分段校验(查表法)/直接计算
* - CRC8/CRC8-MAXIM
* - CRC16-MODBUS
* - CRC32
* @par      注意事项：
* - 每种CRC校验对数据块大小的常用适用范围：CRC8(几个到几十字节)、CRC16(几十个到几百字节)、CRC32(几百到几兆字节)
* @par      修改日志：
* <table>
* <tr><th>日期          <th>版本        <th>作者    <th>更新内容        </tr>
* <tr><td>2024/02/18    <td>V1_0_0      <td>何锡斌  <td>初版发布；      </tr>
* </table>
*/
#ifndef _CRC_H_
#define _CRC_H_



/********************************************配置选项********************************************/
/*选择CRC代码处理方式*/
#define CRC_TABLE_METHOD		1						/**< 采用表格方法(1:启用0:启用计算) */
#define CRC_MATH_METHOD			!CRC_TABLE_METHOD		/**< 采用计算方法 */


/*选择启用哪些CRC校验*/
#define USE_CRC8				1						/**< 启用CRC8校验 */
#define USE_CRC8MAXIM			1						/**< 启用CRC8校验/MAXIM */
#define USE_CRC16MODBUS			1						/**< 启用CRC16校验/MODBUS */
#define USE_CRC32				1						/**< 启用CRC32校验 */


/*调试*/
#define CRC_TABLE_PRINT_FLAG	0						/**< 表格打印调试(0:关闭，1:开启) */
/********************************************配置选项 End********************************************/



/********************************************函数声明********************************************/
#ifdef __cplusplus
extern "C" {
#endif


#if CRC_TABLE_METHOD
#if USE_CRC8
/*CRC8校验(表格法)*/
unsigned char CRC8_Table(unsigned char* pData, unsigned int dataLen);
/*CRC8分段校验校验码初始化(表格法)*/
void CRC8_Segmented_CodeInit_Table(unsigned char* crcCode);
/*CRC8分段校验(表格法)*/
unsigned char CRC8_Segmented_Table(unsigned char crcCode, unsigned char* pData, unsigned int dataLen);
#endif /*USE_CRC8*/

#if USE_CRC8MAXIM
/*CRC8MAXIM校验(表格法)*/
unsigned char CRC8_MAXIM_Table(unsigned char* pData, unsigned int dataLen);
/*CRC8MAXIM分段校验校验码初始化(表格法)*/
void CRC8_MAXIM_Segmented_CodeInit_Table(unsigned char* crcCode);
/*CRC8MAXIM分段校验(表格法)*/
unsigned char CRC8_MAXIM_Segmented_Table(unsigned char crcCode, unsigned char* pData, unsigned int dataLen);
#endif /*USE_CRC8MAXIM*/

#if USE_CRC16MODBUS
/*CRC16Modbus校验(表格法)*/
unsigned short CRC16_Modbus_Table(unsigned char* pData, unsigned int dataLen);
/*CRC16Modbus分段校验校验码初始化(表格法)*/
void CRC16_Modbus_Segmented_CodeInit_Table(unsigned short* crcCode);
/*CRC16Modbus分段校验(表格法)*/
unsigned short CRC16_Modbus_Segmented_Table(unsigned short crcCode, unsigned char* pData, unsigned short dataLen);
#endif /*USE_CRC16MODBUS*/

#if USE_CRC32
/*CRC32文件校验(表格法)*/
unsigned int CRC32_Table(unsigned char* pData, unsigned int dataLen);
/*CRC32文件分段校验校验码初始化(表格法)*/
void CRC32_Segmented_CodeInit_Table(unsigned int* crcCode);
/*CRC32文件分段校验(表格法)*/
unsigned int CRC32_Segmented_Table(unsigned int crcCode, unsigned char* data, unsigned int dataLen);
#endif /*USE_CRC32*/
#endif /*CRC_TABLE_METHOD*/



#if (CRC_TABLE_PRINT_FLAG&&CRC_TABLE_METHOD)
/*CRC8表格初始化(用于制作表格)*/
void CRC8TableInit(void);
/*CRC8MAXIM表格初始化(用于制作表格)*/
void CRC8MAXIMTableInit(void);
/*CRC16Modbus表格初始化(用于制作表格)*/
void CRC16ModbusTableInit(void);
/*CRC32文件校验表格初始化(用于制作表格)*/
void CRC32TableInit(void);
#endif /*CRC_TABLE_PRINT_FLAG&&CRC_TABLE_METHOD*/



#if CRC_MATH_METHOD
#if USE_CRC8
/*CRC8校验*/
unsigned char CRC8(unsigned char* data, unsigned short dataLen);
#endif /*USE_CRC8*/
#if USE_CRC8MAXIM
/*CRC8检验/MAXIM*/
unsigned char CRC8_MAXIM(unsigned char* data, unsigned short dataLen);
#endif /*USE_CRC8MAXIM*/
#if USE_CRC16MODBUS
/*CRC16校验/Modbus标准*/
unsigned short CRC16_Modbus(unsigned char* data, unsigned short dataLen);
#endif /*USE_CRC16MODBUS*/
#endif /*CRC_MATH_METHOD*/


#ifdef __cplusplus
}
#endif
#endif
